<?php
/**
 * Created by PhpStorm.
 * User: 王柯 <wangke.email@foxmail.com>
 * Date: 2018\4\7 0007
 * Time: 16:52
 */
namespace wxpay\request;

class WxAppPay{
    /**
     * 微信app支付
     * @param array $params 组装参数 *必传
     * @author 王柯 <wangke.email@foxmail.com>
     * @return \成功时返回，其他抛异常
     */
    public static function pay($params){
        require_once EXTEND_PATH.'/wxpay/lib/WxPay.Data.php';
        require_once EXTEND_PATH.'/wxpay/lib/WxPay.Api.php';

        //微信下单
        $input = new \WxPayUnifiedOrder();

        //设置商品或支付单简要描述
        $input->SetBody($params['body']);

        //设置附加数据，在查询API和支付通知中原样返回，该字段主要用于商户携带订单的自定义数据
        $input->SetAttach($params['subject']);

        //设置商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
        $input->SetOut_trade_no($params['out_trade_no']);

        //设置订单总金额，只能为整数，详见支付金额
        $input->SetTotal_fee($params['total_amount']);

        //设置订单生成时间，格式为yyyyMMddHHmmss
        $input->SetTime_start(date("YmdHis"));

        //设置订单失效时间，格式为yyyyMMddHHmmss
        $input->SetTime_expire(date("YmdHis", time() + 60*10));

        //异步通知地址
        $input->SetNotify_url(config('wxpay.notify_url'));

        //设置接收微信支付异步通知回调地址 设置类型如下：JSAPI，NATIVE，APP
        $input->SetTrade_type("APP");

        //统一下单
        $order_data = \WxPayApi::unifiedOrder($input);

        //开始生成二次签名
        $sign_array = array();

        //二次签名需要的参数
        $sign_array['appid'] = $order_data['appid'];
        $sign_array['partnerid'] = $order_data['mch_id'];
        $sign_array['prepayid'] = $order_data['prepay_id'];
        $sign_array['noncestr'] = $order_data['nonce_str'];

        //必须为10位时间戳
        $sign_array['timestamp'] = time();

        //包名默认 Sign=WXPay
        $sign_array['package'] = 'Sign=WXPay';

        //生成新签名
        $sign = self::makeSign($sign_array);

        $sign_array['sign'] = $sign;

        return $sign_array;
    }

    /**
     * 生成签名
     * @param array $params 需要生成签名的数组 *必传
     * @author 王柯 <wangke.email@foxmail.com>
     * @return string 签名
     */
    public static function makeSign($params){
        //按字典序排序数组参数
        ksort($params);

        //拼接参数
        $string = self::toUrlParams($params);

        //在string后加入key
        $string = $string.'&key='.config('wxpay.key');

        //md5加密
        $string = md5($string);

        //所有字符转为大写
        $result = strtoupper($string);

        return $result;
    }

    /**
     * 转换url参数 将参数拼接为url: key=value&key=value
     * @param $params *必传
     * @author 王柯 <wangke.email@foxmail.com>
     * @return string
     */
    public static function toUrlParams($params){
        $string = '';
        if(!empty($params)){
            $array = array();
            foreach($params as $key => $value){
                $array[] = $key.'='.$value;
            }
            $string = implode("&",$array);
        }
        return $string;
    }

}